#ifndef _CONST_DEFINE_H_
#define _CONST_DEFINE_H_    

#include <stdio.h>

// 版本信息（点分十进制 - ["0.0.3"=3、"1.0.3"= 00.01.00.03] = 65539）
#define TCPA_MONITOR_VERSION    "1.0.6"

// 被监测的进程名称
#define TCP_ACCELERATION_PROCESS_NAME   "td_tunnel_tcp"
// 控制脚本路径
#ifdef TD_SYSTEM
    #define TCP_ACCELERATION_CONTROL_SCRIPT_PATH   "/bin/script"
    #define GET_RCST_GBNNID_CMD "accessinfo -g g_BNN_id | cut -d= -f2"
    // 小站网络配置文件路径
    #define TD_RCSTNETCFG_FILE_PATH                 "/etc/parameters/rcstnetcfg.json"
    // 配置文件路径
    #define TCPA_CFG_FILE_DEFAULT_PATH              "/etc/parameters/tcpa_monitor/tcpa_cfg.json"
    #define TCPA_WHITELIST_CFG_FILE_DEFAULT_PATH    "/etc/parameters/tcpa_monitor/whitelist_cfg.json"
    #define TCPA_WHITELIST_CFG_FILE_LINK_PATH       "/etc/parameters/whitelist_cfg.json"
#else
    #define TCP_ACCELERATION_CONTROL_SCRIPT_PATH   "bash"
    // 测试环境网络配置文件路径
    #define TD_RCSTNETCFG_FILE_PATH                 "conf/rcstnetcfg.json"
    // 配置文件路径
    #define TCPA_CFG_FILE_DEFAULT_PATH              "conf/tcpa_cfg.json"
    #define TCPA_WHITELIST_CFG_FILE_DEFAULT_PATH    "conf/whitelist_cfg.json"
    #define TCPA_WHITELIST_CFG_FILE_LINK_PATH       "conf/whitelist_cfg_ln_s.json"
#endif

#define CFG_FILE_PATH_LEN       1024
#define CFG_FILE_TYPE_MAX_NUM   10              // tcpa_cfg、whitelist_cfg

#define TCP_FASTER_LINK_MAX_NUM 20
#define VRF_MAX_NUM             255
#define WHITE_LIST_RULE_MAX_NUM 100
#define JSON_MEMBER_MAX_NUM     128

// # 默认参数
#define DEFAULT_ACCELERATION_LINK_NUM   10
#define DEFAULT_TCPA_SERVER_PORT        8000
#define DEFAULT_LOCAL_LISTEN_PORT       9000

// 网络模式
typedef enum net_mode_e {
    NET_MODE_NONE = 0,
    NET_MODE_ROUTE,
    NET_MODE_NAT,
}net_mode_e;
static const char *NET_MODE_STR[] = {
    "net_none", "net_route", "net_nat"
};

// tcpa_monitor状态
typedef enum tcpam_status_e {
    TCPA_MONITOR_STATUS_START,              // 启动过程中
    TCPA_MONITOR_STATUS_RUNNING,            // 运行中
    TCPA_MONITOR_STATUS_ABNORMAL,           // 异常
    TCPA_MONITOR_STATUS_EXIT,               // 退出过程
    TCPA_MONITOR_STATUS_STOP                // 停止
}tcpam_status_e;

// TCP加速运行状态
typedef enum tcpa_run_status_e {
    TCPA_RUN_STATUS_STOP,                   // 停止
    TCPA_RUN_STATUS_RUNNING,                // 运行中
}tcpa_run_status_e;


// 对TCP加速程序的操作
#define TCPA_ACTION_STOP    0b0001      // 停止
#define TCPA_ACTION_RESTART 0b0010      // 重启

// tcp加速启动条件的掩码（条件需要全部满足才能启动加速）
#define TCPA_START_REQUIREMENT_LOCAL_ENABLE     0b00000001 // 本地配置使能
#define TCPA_START_REQUIREMENT_RCST_LOGIN       0b00000010 // 已登录

// 加速程序异常状态
#define TCPA_ABNORMAL_STATUS_NONE               0b00000000 // 正常
#define TCPA_ABNORMAL_STATUS_UNSET_SERVER_IP    0b00000001 // 未设置server_ip


// 源码路径宏: CURRENT_DIR

// 监测器状态存储路径
#define TCPA_MONITOR_PROC_PATH              "/run/tcpam/monitor_info"
// 加速程序配置状态存储路径
#define TCPA_MONITOR_TCPA_CFG_PATH          "/run/tcpam/tcpa_cfg"
// 白名单配置状态存储路径
#define TCPA_MONITOR_WHITELIST_CFG_PATH     "/run/tcpam/whitelist_cfg"


// tcp加速配置文件相关

// 配置参数key的最大长度
#define TCPA_CFG_PARAMETER_KEY_LEN 128
// 配置参数key名称（需要与配置文件中的key完全一致（顺序也要一致））
static const char TCPA_CFG_PARAMETER_KEY[][TCPA_CFG_PARAMETER_KEY_LEN] = {
    "vrf_name",
    "enable",
    "max_connect",
    "server_ip",
    "server_port",
    "listen_port"
};
typedef enum tcpa_cfg_parameter_e {
    TCPA_CFG_PARAMETER_VRF_ID,
    TCPA_CFG_PARAMETER_ENABLE,
    TCPA_CFG_PARAMETER_MAX_CONNECT,
    TCPA_CFG_PARAMETER_SERVER_IP,
    TCPA_CFG_PARAMETER_SERVER_PORT,
    TCPA_CFG_PARAMETER_LISTEN_PORT
}tcpa_cfg_parameter_e;

// 白名单配置key的最大长度
#define WHITELIST_CFG_PARAMETER_KEY_LEN 128
// 配置参数key名称（需要与配置文件中的key完全一致（顺序也要一致））
static const char WHITELIST_CFG_PARAMETER_KEY[][WHITELIST_CFG_PARAMETER_KEY_LEN] = {
    "vrf_name",
    "src_ip",
    "src_port",
    "dst_ip",
    "dst_port"
};
typedef enum whitelist_cfg_parameter_e {
    WHITELIST_CFG_PARAMETER_VRF_ID,
    WHITELIST_CFG_PARAMETER_SRC_IP,
    WHITELIST_CFG_PARAMETER_SRC_PORT,
    WHITELIST_CFG_PARAMETER_DST_IP,
    WHITELIST_CFG_PARAMETER_DST_PORT
}whitelist_cfg_parameter_e;

typedef enum tcpa_cfg_file_type_e {
    TCPA_CFG,
    WHITELIST_CFG
}tcpa_cfg_file_type_e;

typedef enum rcst_login_e {
    RCST_LOGOUT,
    RCST_LOGIN
}rcst_login_e;


// 区分系统位数读取
#include <stdint.h>
#if __WORDSIZE == 64
#define PRINTF_UINT64_FORMAT "%lu"
#else
#define PRINTF_UINT64_FORMAT "%llu"
#endif

/*****  日志    *****/ 
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#define MY_FILE(x)              strrchr(x, '/')?strrchr(x,'/')+1:x
#define PRINT_LOG(fmt, ...)     printf("[%s:%d]  " fmt , MY_FILE(__FILE__), __LINE__, ##__VA_ARGS__);
#define PRINT_LOG__(fmt, ...)     \
{                               \
    printf(fmt, ##__VA_ARGS__);\
    printf("  [%s:%d]\n", MY_FILE(__FILE__), __LINE__);\
}
#define PRINT_TIME_LOG(fmt, ...)     \
{                               \
    struct timeval now_time;\
    gettimeofday(&now_time, NULL);\
    time_t now_sec = now_time.tv_sec + 8 * 3600;\
    struct tm *local_time = localtime(&now_sec);\
    char time_str[64];          \
    strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", local_time);  \
    printf("[%s.%06ld]  " fmt , time_str, now_time.tv_usec, ##__VA_ARGS__);\
    printf("  [%s:%d]\n", MY_FILE(__FILE__), __LINE__);\
}
// 按需要替换不同格式的日志
#define TCPAM_LOG_DEBUG(fmt, ...)   PRINT_TIME_LOG("[DEBUG] " fmt, ##__VA_ARGS__)
#define TCPAM_LOG_INFO(fmt, ...)    PRINT_TIME_LOG("[INFO] " fmt, ##__VA_ARGS__)
#define TCPAM_LOG_WARNING(fmt, ...) PRINT_TIME_LOG("[WARN] " fmt, ##__VA_ARGS__)    
#define TCPAM_LOG_ERROR(fmt, ...)   PRINT_TIME_LOG("[ERROR] " fmt, ##__VA_ARGS__)

#endif